#!/usr/bin/env node

const { execSync } = require('child_process');
const fs = require('fs');
const path = require('path');

// 获取命令行参数
const args = process.argv.slice(2);
const releaseType = args[0]; // patch, minor, major

// 验证参数
if (!releaseType || !['patch', 'minor', 'major'].includes(releaseType)) {
  console.error('请提供有效的版本类型: patch, minor, 或 major');
  process.exit(1);
}

try {
  // 1. 检查是否有未提交的更改
  console.log('检查 Git 状态...');
  const gitStatus = execSync('git status --porcelain', { encoding: 'utf-8' });
  if (gitStatus.trim() !== '') {
    console.error('请先提交所有更改再发布新版本');
    process.exit(1);
  }

  // 2. 检查当前分支
  const currentBranch = execSync('git branch --show-current', { encoding: 'utf-8' }).trim();
  if (currentBranch !== 'main' && currentBranch !== 'master') {
    console.warn(`警告: 你当前在 ${currentBranch} 分支，通常发布应该在 main 或 master 分支进行`);
  }

  // 3. 获取当前版本号
  const packageJson = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf-8'));
  const currentVersion = packageJson.version;
  console.log(`当前版本: ${currentVersion}`);

  // 4. 运行测试（如果有的话）
  console.log('运行测试...');
  try {
    execSync('npm test', { stdio: 'inherit' });
  } catch (error) {
    console.error('测试失败，无法发布');
    process.exit(1);
  }

  // 5. 构建项目
  console.log('构建项目...');
  execSync('npm run build', { stdio: 'inherit' });

  // 6. 递增版本号
  console.log(`递增 ${releaseType} 版本...`);
  execSync(`npm version ${releaseType}`, { stdio: 'inherit' });

  // 7. 获取新版本号
  const newPackageJson = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf-8'));
  const newVersion = newPackageJson.version;
  console.log(`新版本: ${newVersion}`);

  // 8. 发布到 npm
  console.log('发布到 npm...');
  execSync('npm publish', { stdio: 'inherit' });

  // 9. 推送更改到远程仓库
  console.log('推送更改到远程仓库...');
  execSync('git push', { stdio: 'inherit' });
  execSync('git push --tags', { stdio: 'inherit' });

  console.log(`✅ 成功发布版本 ${newVersion} 到 npm!`);
} catch (error) {
  console.error('发布失败:', error.message);
  process.exit(1);
}